/**
 * 浏览器的事件环
 */
//=> 进程, 线程
//进程: 进程是计算机分配任务 和 调度任务的最小单位. 浏览器是一个多进程模型.每个tab页卡都是
// 一个独立的进程(更稳定).

// JS 是单线程的(JS的主线程是单线程的).
// 线程: 常见的线程有哪些? GUI渲染, 页面渲染, 绘图, 绘制, 3d动画
// js 渲染引擎也是个线程: 执行 js 代码, 当js执行时, 渲染进程会挂起 -> 渲染时不能执行 js

// 事件触发线程: EventLoop
// 浏览器的一些webApi 也会创建一些线程, 事件, 定时器, ajax请求都会创造一个线程.

/**
 *  宏任务, 微任务.
 *
 *
 *  宏任务:
 *  - 代码刚开始的执行脚本 (script标签包含的js代码) 也是一个宏任务.
 *  - UI 渲染 setInterval, setTimout setImmediate I/O文件读写. 事件, ajax / MessageChannel
 *
 *
 *  微任务:
 *    即: 除了promise 和 MutationObserver, 其他基本上都是 宏任务了.
 *    promise, MutationObserver, object.observe  / process.nextTick(node中的)
 */


//1. 先执行 script 脚本中的宏任务代码, 将宏任务 和 微任务进行分类. 如果调用的是浏览器 api,浏览器会开
// 一个线程, 等时间到了, 会自动的放入到宏任务队列中, 微任务是直接放到微任务队列中的.

//2. js执行完毕后, 会清空所有的微任务, 如果微任务再产生微任务, 会放到当前微任务队列的尾部.
//3. 如果页面需要渲染, 则会执行渲染流程.
// 事件触发线程, 会不停的扫描 宏任务队列, 如果宏任务队列中有对应的回调, 会取出来 执行一个, 继续执行上述过程.


// 宏任务每次调用一个, 微任务每次都是清空队列.

// 微任务队列, 每次执行宏任务, 都会创造一个新的队列.
// 但是宏任务队列只有一个.
